#pragma once
#include <pthread.h>
#include "Mutex.hpp"
using namespace MutexModule;
namespace CondModule
{
    /**
     * @class Cond
     * @brief 条件变量类，用于线程同步
     * 
     * 该类封装了POSIX条件变量，提供等待、通知和广播功能，用于线程间的同步操作。
     */
    class Cond
    {
    public:
        /**
         * @brief 构造函数
         * 
         * 初始化条件变量。
         */
        Cond()
        {
            pthread_cond_init(&_cond, nullptr);
        }

        /**
         * @brief 等待函数
         * 
         * 使当前线程等待条件变量，直到条件变量被通知或广播。
         * @param mutex 用于同步的互斥锁对象
         */
        void Wait(Mutex &mutex)
        {
            int n = pthread_cond_wait(&_cond, mutex.Get());
            (void)n;
        }

        /**
         * @brief 通知函数
         * 
         * 唤醒等待在该条件变量上的一个线程。
         */
        void Signal()
        {
            int n = pthread_cond_signal(&_cond);
            (void)n;
        }

        /**
         * @brief 广播函数
         * 
         * 唤醒等待在该条件变量上的所有线程。
         */
        void Broadcast()
        {
            int n = pthread_cond_broadcast(&_cond);
            (void)n;
        }

        /**
         * @brief 析构函数
         * 
         * 销毁条件变量。
         */
        ~Cond()
        {
            pthread_cond_destroy(&_cond);
        }

    private:
        /**
         * @brief 条件变量
         * 
         * 内部维护的POSIX条件变量。
         */
        pthread_cond_t _cond;
    };
}  // namespace CondModule
